package com.mililoan.common.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;

import com.mililoan.common.bean.PageResultSet;
import com.mililoan.common.exception.DbException;

public class JdbcPageResultSetDao<T> {
	/**
	 * 结果的记录对象
	 */
	PageResultSet<T> prs=new PageResultSet<T>();

	/**
	 * 设置需要转到的当前页数
	 * @param page  当前页数
	 */
	public void setPage(int page)
	{
		if(page<1)page=1;
		prs.setCurPage(page);
	}
	
	/**
	 * 默认构造函数
	 * */
	public JdbcPageResultSetDao()
	{
		
	}
	
	/**
	 * 默认构造函数
	 * */
	public JdbcPageResultSetDao(int pageSize)
	{
		prs.setPageSize(pageSize);
	}	
	
	
	/**
	 * 设置尺寸
	 * */
	public void setPageSize(int pageSize)
	{
		prs.setPageSize(pageSize);
	}
	
	
	/**
	 * 分页处理的方法
	 * @param l_sql 查询的sql语句
	 * @param p_commonDao 数据访问对象
	 * @return 分页结果
	 */
	public PageResultSet<T> pageResultSet(String l_sql,JdbcTemplate template,RowCallbackHandler handler) throws DbException
	{
		return pageResultSet(l_sql,template,null,handler);
	}
	
	
	/**
	 * 分页处理的方法
	 * @param l_sql 查询的sql语句
	 * @param p_commonDao 数据访问对象
	 * @return 分页结果
	 */
	public PageResultSet<T> pageResultSet(String l_sql,JdbcTemplate template,Object[] arg,RowCallbackHandler handler) throws DbException
	{
		
		int l_srow = (prs.getCurPage() - 1) * prs.getPageSize()+ 1;
		Connection con=null;
		PreparedStatement pstmt=null;
		try {
			
			
			 con=template.getDataSource().getConnection();
			 pstmt=con.prepareStatement(l_sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
			
			//设置fetchSize
			pstmt.setFetchSize(prs.getPageSize());
			if(arg==null)
			{
				//prs.setRecordNum(template.queryForInt(countSql));
			}
			else
			{
				for(int i=0;i<arg.length;i++)
				{
					Object o=arg[i];
					if(o==null)
					{
						System.out.println("参数为空-------------------------");
						throw new DbException("分页时,无效参数异常：");
					}
					if(String.class==o.getClass())
					{
						pstmt.setString(i+1,(String)o);
					}
					else if(Integer.class==o.getClass())
					{
						pstmt.setInt(i+1,((Integer)o).intValue());
					}
					else if(Long.class==o.getClass())
					{
						pstmt.setInt(i+1,((Long)o).intValue());
					}
					else 
					{
						throw new DbException("分页时,参数类型不对异常：");
					}
										
				}
	
			}
			
			//执行
			ResultSet rs=pstmt.executeQuery();
			rs.last();
			//设置总记录条数
			prs.setRecordNum(rs.getRow());

			if (l_srow > prs.getRecordNum()) 
			{
				l_srow = (prs.getAllPage() - 1) * prs.getPageSize() + 1;
				 prs.setCurPage(prs.getAllPage());
			}
			
			
            if(l_srow==1)//第一页
            {
            	rs.beforeFirst();
            }
            else
            {
            	rs.absolute(l_srow-1);
            }
            int i=0;
            while(rs.next()&&i<prs.getPageSize())
            {
            	i++;
            	this.processRow(handler,rs);
            }
            rs.close();

		} catch (DataAccessException e) {
			e.printStackTrace();
			throw new DbException("分页时异常："+e.getMessage());
		}
		catch (SQLException e) {
			e.printStackTrace();
			throw new DbException("分页时异常："+e.getMessage());
		}
		finally
		{
		    try {
				pstmt.close();
				con.close();
			} catch (SQLException e) {
				//e.printStackTrace();
			}
			
		}
       
		return prs;
	}
	
	
	
	public void processRow(RowCallbackHandler handler,ResultSet rs) throws DbException
	{
		try {
			handler.processRow(rs);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new DbException("分页时processRow异常："+e.getMessage());
		}
	}
	
	
	/**
	 * @return
	 */
	public PageResultSet getPrs() {
		return prs;
	}

}
